package capaGrafica;
import java.awt.EventQueue;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JPanel;

import org.openstreetmap.gui.jmapviewer.Coordinate;
import org.openstreetmap.gui.jmapviewer.JMapViewer;
import org.openstreetmap.gui.jmapviewer.MapMarkerDot;
import org.openstreetmap.gui.jmapviewer.MapPolygonImpl;
import org.openstreetmap.gui.jmapviewer.interfaces.MapMarker;
import org.openstreetmap.gui.jmapviewer.interfaces.MapPolygon;

import capaDatos.Serializacion;
import capaNegocio.Inteligencia;
import capaNegocio.PedidoCliente;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import java.awt.Color;
import javax.swing.UIManager;
import java.awt.ComponentOrientation;
import java.awt.Font;
import java.util.ArrayList;

import javax.swing.SwingConstants;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class MainForm {

	private static JFrame frame;
	private static JMapViewer mapa;
	private static Coordinate nuevaCoordenada;
	private static Fecha fechaRecorido;
	private static Inteligencia inteligencia= new Inteligencia();
	private Coordinate ungs = new Coordinate(-34.52225714792779, -58.699607849121094);
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@SuppressWarnings("static-access")
			public void run() {
				try {
					MainForm window = new MainForm();
					window.frame.setVisible(true);
					
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		
	}

	public MainForm()
	
	{
		try{
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		}
		catch (Exception e){
			System.out.println("Error setting native LAF: "+e);
		}
		
		
		initialize();
		recuperarDatos();
		
	}


	private void initialize()
	{
		frame = new JFrame();
		frame.addWindowListener(new WindowAdapter() {
			@SuppressWarnings("static-access")
			// serializa al cerrar la ventana con la cruz
			@Override
			public void windowClosing(WindowEvent e) {
				Serializacion.persistenciaGuardar(inteligencia.getListaPedidos());
				
			}
		});
		frame.setResizable(false);
		frame.setBounds(100, 100, 891, 606);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		JPanel panelSuperior = new JPanel();
		panelSuperior.setBounds(0, 0, 877, 41);
		panelSuperior.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		panelSuperior.setBackground(UIManager.getColor("FormattedTextField.background"));
		panelSuperior.setBorder(null);
		frame.getContentPane().add(panelSuperior);
		
		JButton btnEliminarPedido = new JButton("Eliminar Pedido");
		btnEliminarPedido.setBounds(644, 8, 143, 25);
		btnEliminarPedido.setFocusable(false);
		btnEliminarPedido.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				lanzarVentanaDeEliminarPedido();
				
			}

		});
		panelSuperior.setLayout(null);
		
		
		JLabel lblNewLabel_2 = new JLabel("Para Agregar Pedido hacer shift+click del mouse, sobre el mapa");
		lblNewLabel_2.setHorizontalAlignment(SwingConstants.LEFT);
		lblNewLabel_2.setForeground(Color.RED);
		lblNewLabel_2.setFont(new Font("Dialog", Font.BOLD, 12));
		lblNewLabel_2.setBounds(12, 10, 463, 20);
		panelSuperior.add(lblNewLabel_2);
		btnEliminarPedido.setBackground(Color.WHITE);
		panelSuperior.add(btnEliminarPedido);
		
		// evento boton salir
		JButton btnNewButton = new JButton("Salir");
		btnNewButton.addActionListener(new ActionListener() {
			@SuppressWarnings("static-access")
			public void actionPerformed(ActionEvent arg0) {
				Serializacion.persistenciaGuardar(inteligencia.getListaPedidos());
				System.exit(0);
			}
		});
		btnNewButton.setBounds(799, 8, 66, 25);
		btnNewButton.setFocusable(false);
		btnNewButton.setBackground(Color.WHITE);
		panelSuperior.add(btnNewButton);
		
		//evento boton ver recorrido
		JButton btnVerRecorridos = new JButton("Ver Recorridos");
		btnVerRecorridos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				lanzarVentanaVerPedidos();
			}

		});
		btnVerRecorridos.setFocusable(false);
		btnVerRecorridos.setBackground(Color.WHITE);
		btnVerRecorridos.setBounds(489, 8, 143, 25);
		panelSuperior.add(btnVerRecorridos);
		
		JPanel panelIzquierdo = new JPanel();
		panelIzquierdo.setBounds(0, 35, 10, 395);
		frame.getContentPane().add(panelIzquierdo);
		
		// mapa
		mapa = new JMapViewer();
		mapa.setBounds(0, 47, 877, 514);
		mapa.setFocusable(false);
		mapa.setBorder(null);
		
		// evento agregar cliente (mouse+shift)
		mapa.addMouseListener(new MouseAdapter() {
			@SuppressWarnings("static-access")
			@Override
			public void mousePressed(MouseEvent e) {

				if (e.getButton()== e.BUTTON1 && e.isShiftDown()){
					
					if(mapa.getMapPolygonList().isEmpty()){

						nuevaCoordenada = ubicacionDelPedido(e);// toma el evento del mouse
						marcarEnElMapa(nuevaCoordenada);
						lanzarVentanaDeNuevoPedido();
					}else{
						mapa.getMapPolygonList().clear();
					}
				}
			}
			
		});
		perzonalizarMapa();
		mapa.repaint();
		
	}
	// metodos 
	
	public static void habilitarVentana(boolean bool){
		frame.setEnabled(bool);
	}

	public static Coordinate getNuevaCoordenada() {
		return nuevaCoordenada;
	}

	public static JMapViewer getMapa() {
		return mapa;
	}

	private void perzonalizarMapa() {
	
		mapa.setZoomContolsVisible(true);
		mapa.setDisplayPositionByLatLon(ungs.getLat(),ungs.getLon(), 10);
		mapa.addMapMarker(crearPuntoInicio(ungs));
		
		frame.getContentPane().add(mapa);
	}
	
	
	private void marcarEnElMapa(Coordinate coordenada) {
		
			MapMarkerDot marca = new MapMarkerDot(coordenada);
			mapa.addMapMarker(marca);
	}
	
	// toma point generado por el clik del mouse y lo transforma en coordenada 
	private Coordinate ubicacionDelPedido(MouseEvent e) {
		
		Point punto = new Point();
		Coordinate coordenada;
		punto = e.getPoint();
		coordenada=mapa.getPosition(punto);
		
		return coordenada;
		
	}

	private void lanzarVentanaDeNuevoPedido() {
		
		VentanaPedidos nueva = new VentanaPedidos();
		nueva.setVisible(true);
		nueva.setLocationRelativeTo(frame);
		nueva.setAlwaysOnTop(true);
		
		// saca del mapa algun recorrido dibujado
		mapa.getMapPolygonList().clear();
		mapa.repaint();
		
	}
	private void lanzarVentanaDeEliminarPedido() {
		
		VentanaEliminarPedido nueva = new VentanaEliminarPedido();
		nueva.setVisible(true);
		nueva.setLocationRelativeTo(frame);
		nueva.setAlwaysOnTop(true);
		mapa.getMapPolygonList().clear();
		mapa.repaint();

		
	}
	private void lanzarVentanaVerPedidos() {
		
		VentanaVerPedidos nueva = new VentanaVerPedidos();
		nueva.setVisible(true);
		nueva.setLocationRelativeTo(frame);
		nueva.setAlwaysOnTop(true);
		mapa.getMapPolygonList().clear();
		mapa.repaint();
		
	}

	public static Fecha getFechaRecorido() {
		return fechaRecorido;
	}

	public static void setFechaRecorido(Fecha fechaRecorido) {
		MainForm.fechaRecorido = fechaRecorido;
	}
	
	public static void mostrarRecorrido(){ //por fecha
		
		ArrayList<PedidoCliente> recorrido = Inteligencia.damePedidosDeLaFechaOrdenados(fechaRecorido);
		ArrayList<Coordinate> lista = new ArrayList<Coordinate>();
		
		for(PedidoCliente e: recorrido)
			lista.add(e.dameCordenada());
		
		MapPolygon poligono = new MapPolygonImpl(lista);
		poligono.getStyle().setColor(Color.GREEN);
		mapa.addMapPolygon(poligono);
		
		
	}

	public static Inteligencia getInteligencia() {
		return inteligencia;
	}

	public static void setInteligencia(Inteligencia inteligencia) {
		MainForm.inteligencia = inteligencia;
	}
	
	// persistencia
	@SuppressWarnings("static-access")
	private void recuperarDatos() {

		if(Serializacion.persistenciaRecuperar() != null){

			ArrayList<PedidoCliente> pedidosRecuperados = Serializacion.persistenciaRecuperar();

			for(PedidoCliente e: pedidosRecuperados){
				marcarEnElMapa(e.dameCordenada());
				inteligencia.agregarPedido(e);
			}
		}

	}
	// punto de la ungs como inicio
	 private MapMarker crearPuntoInicio(Coordinate ungs){
		
			MapMarkerDot inicio = new MapMarkerDot(ungs);
			
			inicio.setName("Inicio");
			inicio.setColor(Color.YELLOW);
			inicio.setBackColor(Color.red);
			return inicio;
		 
	 }

	
}
